import { AnalyticsData } from "../publisher/IAnalyticsAble";
import { ViewConfig } from "./IViewLoader";
import { ViewAnalyticsInfo } from "./ViewManager";

/**
 * Tips类型枚举
 */
    export enum TipsType {
    /**
     * 常规提示
     */
    normal,
    /**
     * 警告
     */
    warn,
    /**
     * 错误
     */
    error
}

/**
 * 视图类，控制本身和子项的显示逻辑
 */
export interface IView {
    name:string;
    config:ViewConfig;
    analyticsInfo:ViewAnalyticsInfo;
    touchEnabled:boolean;
    /**
     * 是否在舞台上
     */
    readonly inStage:boolean;
    addView(view:IView, index?:number):void;
    removeView(view:IView, destroy?:boolean):void;
    setData(...data: any[]):void;
    close(...eventParams: any[]):void;
    removeFromParent(destroy?:boolean):void;
    allDestroy():void;

    /**
     * 视图内发生事件时，动态获取上报的信息。比如关卡内的动态数据。
     * @param event 
     */
    getAnalyticsDataOnViewEvent?(event:"open"|"close"|string):AnalyticsData;
}

/**
 * 场景类
 */
export interface IScene extends IView {
    /**
     * 已弃用，请调用app.viewManager.addView.
     * 添加视图到当前主视图
     * 根据视图的cache配置对视图进行缓存，再此显示对应视图时，复用之前缓存的视图。
     * Scene被销毁时，所有缓存视图随之销毁。
     * @deprecated
     * @param config 
     * @param parent 目标父级视图，默认添加app.viewManager.view()
     * @param data 
     */
    addViewTo<T extends IView>(config:ViewConfig, parent?:IView, ...data:any[]):Promise<T>;
    
    /**
     * 已弃用，请调用app.viewManager.switchTo.
     * 将主视图切换到目标视图，并移除之前主视图。
     * 根据视图的cache配置对视图进行缓存，再此显示对应视图时，复用之前缓存的视图。
     * Scene被销毁时，所有缓存视图随之销毁。
     * 使用注意：每个类型的视图在缓存中只缓存最新的视图实例。
     * @deprecated
     * @param config 
     * @param data 
     */
    switchView<T extends IView>(config:ViewConfig, ...data:any[]):Promise<T>;

    /**
     * 已弃用，请调用app.viewManager.switchBack.
     * 切回当前主视图到上一个主视图。
     * @deprecated
     * @param data 
     * @returns 
     */
    switchBack<T extends IView>(...data:any[]):Promise<T>;

    /**
     * 显示正常提示
     * @param tipContent 提示文本内容
     */
    tips(message:string):void;
    /**
     * 显示警告提示
     * @param tipContent 警告文本内容
     */
    warn(message:string):void;
    /**
     * 显示错误提示
     * @param tipContent 错误文本内容
     */
    error(message:string):void;

    /**
     * 添加视图到场景最上层
     * @param view 
     */
    addToTopup(view:IView):void;

    /**
     * 添加视图到网络层
     * @param view 
     */
    addToNet(view:IView):void;

    /**
     * 添加视图到引导层
     * @param view 
     */
    addToTutorial(view:IView):void;

    /**
     * 添加视图到弹出层
     * @param view 
     */
    addToAlert(view:IView):void;

    /**
     * 添加视图到UI层
     * @param view 
     */
    addToUI(view:IView):void;

    /**
     * 添加视图到背景层
     * @param view 
     */
    addToBG(view:IView):void;
}
